<?php
/**
 * Created by PhpStorm
 * User: whh
 * Date: 2022/7/23
 * Time: 14:25
 */

namespace app\backstage\classes\helper;

use app\backstage\model\ManagerUser;
use Firebase\JWT\JWT;
use Firebase\JWT\Key;

class JwtToken
{
    private static $key = 'whh951128';//秘钥

    /**
     * 签发令牌
     * @param $uid
     * @return string
     * @Author: whh
     */
    public static function createToken($uid)
    {
        $time = time(); //当前时间
        $payload = [
            'iss' => '', //签发者可选
            'aud' => '', //接收该JWT的一方，可选
            'iat' => $time, //签发时间
            'nbf' => $time, //(Not Before)：某个时间点后才能访问，比如设置time+30，表示当前时间30秒后才能使用
            'exp' => $time + 43200, //过期时间,这里设置12个小时
            'uid' => $uid//...序列化，这样存不知道有没有坏处，你们可以改掉
        ];
        $keyId = "keyId";
        return JWT::encode($payload, self::$key, 'HS256', $keyId); //输出Token
    }

    /**
     * 解析令牌
     * @param string $token
     * @return array
     */
    public static function parseToken(string $token)
    {
        try {
//            JWT::$leeway = 60;//当前时间减去60，把时间留点余地
            $key = new Key(self::$key,'HS256');//HS256方式，这里要和签发的时候对应
            $decoded = JWT::decode($token, $key);
            return ['status' => true, 'uid' => $decoded->uid];
        } catch (\Firebase\JWT\SignatureInvalidException $e) {  //签名不正确
            return ['status' => false, 'data' => errJson($e->getMessage(), 1001)];
        } catch (\Firebase\JWT\BeforeValidException $e) {  // 签名在某个时间点之后才能用
            return ['status' => false, 'data' => errJson($e->getMessage(), 1001)];
        } catch (\Firebase\JWT\ExpiredException $e) {  // token过期
            return ['status' => false, 'data' => errJson("登录过期，请重新登录", 1001)];
        } catch (\Exception $e) {  //其他错误
            return ['status' => false, 'data' => errJson($e->getMessage())];
        }
        //Firebase定义了多个 throw new，我们可以捕获多个catch来定义问题，catch加入自己的业务，比如token过期可以用当前Token刷新一个新Token
    }
}